﻿namespace QueryBuilder.Core.Query
{
    /// <summary>
    /// 
    /// </summary>
    public interface IConstraintPresenter
    {
        /// <summary>
        /// Presents the specified expression.
        /// </summary>
        /// <param name="expression">The expression.</param>
        void Present(Expression expression);

        /// <summary>
        /// Presents the specified variable.
        /// </summary>
        /// <param name="variable">The variable.</param>
        void Present(Variable variable);

        /// <summary>
        /// Presents the specified variable.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="variable">The variable.</param>
        void Present<T>(Variable<T> variable);

        /// <summary>
        /// Presents the specified aggregate.
        /// </summary>
        /// <param name="aggregate">The aggregate.</param>
        void Present(Aggregate aggregate);

        /// <summary>
        /// Presents the specified column.
        /// </summary>
        /// <param name="column">The column.</param>
        void Present(Column column);

        /// <summary>
        /// Presents the specified aliased constraint.
        /// </summary>
        /// <param name="aliasedConstraint">The aliased constraint.</param>
        void Present(AliasedConstraint aliasedConstraint);

        void Present(Condition constraint);
    }
}